package com.dingding.manager.modules.system.service.impl;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.dingding.manager.common.beans.sys.SysUser;
import com.dingding.manager.common.beans.sys.SysUserRole;
import com.dingding.manager.common.dao.Page;
import com.dingding.manager.common.exception.BussinessException;
import com.dingding.manager.common.exception.enums.BizExceptionEnum;
import com.dingding.manager.core.aop.log.LogRecord;
import com.dingding.manager.core.shiro.ShiroKit;
import com.dingding.manager.core.shiro.ShiroUser;
import com.dingding.manager.core.util.ToolUtil;
import com.dingding.manager.modules.system.dao.UserDao;
import com.dingding.manager.modules.system.dto.user.ReqAddUserDTO;
import com.dingding.manager.modules.system.dto.user.ReqUserListDTO;
import com.dingding.manager.modules.system.dto.user.ResUserDTO;
import com.dingding.manager.modules.system.dto.user.UserInfo;
import com.dingding.manager.modules.system.service.UserService;


/**
 * 
* @ClassName: UserServiceImpl 
* @Description: 用户管理service实现类
* @author SUNZHICHENG 
* @date 2016年12月1日 下午1:41:56 
* @version V2.6.2
 */

@Service("userService")
public class UserServiceImpl implements UserService{
	
	@Resource(name="userDao")
	UserDao userDao;
	
	
	/**
	 * @Description: 根据用户id查询用户信息        
	 * @date 2016年12月1日 下午2:08:23
	 * @author SUNZHICHENG 
	 * @since V2.6.2
	 */
	@Transactional(readOnly=true)
	@Override
	public ResUserDTO getUserById(Integer userId) {
		return userDao.getUserById(userId);
	}
	
	/**
	 * @Description: 根据用户名获取用户信息
	 * @param name 用户名     
	 * @date 2016年12月2日 下午3:10:51
	 * @author SUNZHICHENG 
	 * @since V2.6.2
	 */
	@Override
	@Transactional(value = "txManager",readOnly = true)
	public SysUser getUserByName(String name) {
		if (ToolUtil.isNotEmpty(name)) {
			return userDao.getUserByName(name);
		}
		return null;
		 
	}
	
	/**
	 * @Description:根据用户名获取用户常用信息       
	 * @date 2016年12月4日 下午5:17:44
	 * @author SUNZHICHENG 
	 * @since V2.6.2
	 */
	@Override
	@Transactional(value = "txManager",readOnly = true)
	public UserInfo getUserInfoByName(String name) {
		if (ToolUtil.isNotEmpty(name)) {
			return userDao.getUserInfoByName(name);
		}
		return null;
	}
	
	
	/**
	 * @Description: 查询所有用户列表或按照条件查询用户列表
	 * @param condition  查询条件 （此条件可为空）      
	 * @date 2016年12月1日 下午2:11:26
	 * @author SUNZHICHENG 
	 * @since V2.6.2
	 */
	@Transactional(readOnly=true)
	@Override
	public Page<ResUserDTO> getUserList(ReqUserListDTO reqUserListDTO,Integer start, Integer length) {		
		return userDao.getUserList(reqUserListDTO,start,length);
	
	}
	
	
	
	/**
	 * @Description: 新建用户（添加新用户）
	 * @param user 要保存的用户信息       
	 * @date 2016年12月1日 下午2:31:41
	 * @author SUNZHICHENG 
	 * @since V2.6.2
	 */
	@LogRecord(moduleName="用户管理",option="添加")
	@Override
	@Transactional(readOnly=false)
	public void addUser(ReqAddUserDTO reqAddUserDTO) {
		//获取当前登录用户信息
		ShiroUser shiroUser = ShiroKit.getUser();
		Integer currentId=shiroUser.getId();
		if (ToolUtil.isNotEmpty(reqAddUserDTO.getLoginName())) {
			//查询用户是否已存在
			List<SysUser> users = userDao.getUsers(reqAddUserDTO.getLoginName());
			if (!users.isEmpty()) {
				throw new BussinessException(BizExceptionEnum.INFO_REPEAT);
			}
			
			//用户赋值
			SysUser user=new SysUser();
			user.setCompanyId(reqAddUserDTO.getCompanyId());
			user.setDeptId(reqAddUserDTO.getCompanyId());
			user.setLoginName(reqAddUserDTO.getLoginName());
			user.setPassword(reqAddUserDTO.getPassword());
			user.setTrueName(reqAddUserDTO.getTrueName());
			user.setPhone(reqAddUserDTO.getPhone());
			user.setUserStatus(reqAddUserDTO.getUserStatus());
			user.setCreateUserId(currentId);
			user.setCreateTime(new Date());
			user.setRemarks(reqAddUserDTO.getRemarks());
			userDao.addUser(user);
			
			//角色关联关系赋值
			for (int i = 0; i < reqAddUserDTO.getRoleIds().size(); i++) {
				SysUserRole userRole=new SysUserRole();
				userRole.setSysUserId(user.getSysUserId());
				userRole.setSysRoleId(reqAddUserDTO.getRoleIds().get(i));
				userDao.addUserRole(userRole);
			}	
		}

	}
	
	/**
	 * @Description: 修改用户信息
	 * @param user 修改后的用户信息       
	 * @date 2016年12月1日 下午2:28:00
	 * @author SUNZHICHENG 
	 * @since V2.6.2
	 */
	@LogRecord(moduleName="用户管理",option="修改")
	@Override
	@Transactional(readOnly=false)
	public void modifyUser(ReqAddUserDTO reqAddUserDTO,Integer userId) {
		//获取修改的用户
		ResUserDTO resUserDTO = userDao.getUserById(userId);
		//获取当前登录用户信息
		ShiroUser shiroUser = ShiroKit.getUser();
		Integer currentId=shiroUser.getId();
		
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		
		if (ToolUtil.isNotEmpty(reqAddUserDTO.getLoginName())) {
			//查询用户是否已存在
			List<SysUser> users = userDao.getUsers(reqAddUserDTO.getLoginName());
			if (users.size()>0) {
				for (SysUser sysUser : users) {
					//已存在的用户和要修改的用户是否同一数据
					if (!sysUser.getSysUserId().equals(resUserDTO.getSysUserId())  ) {
						throw new BussinessException(BizExceptionEnum.INFO_REPEAT);
					}
				}
			}
			//修改用户信息
			SysUser user=new SysUser();
			user.setSysUserId(resUserDTO.getSysUserId());
			user.setCompanyId(reqAddUserDTO.getCompanyId());
			user.setDeptId(reqAddUserDTO.getCompanyId());
			user.setLoginName(reqAddUserDTO.getLoginName());
			user.setPassword(resUserDTO.getPassword());
			user.setTrueName(reqAddUserDTO.getTrueName());
			user.setPhone(reqAddUserDTO.getPhone());
			user.setLoginIp(resUserDTO.getLoginIp());			
			try {
				if (ToolUtil.isNotEmpty(resUserDTO.getLoginTime())) {
					user.setLoginTime(sdf.parse(resUserDTO.getLoginTime()));
				}				
				user.setCreateTime(sdf.parse(resUserDTO.getCreateTime()));
			} catch (ParseException e) {
				e.printStackTrace();
				throw new BussinessException(BizExceptionEnum.SERVER_ERROR);
			}
			user.setUserStatus(reqAddUserDTO.getUserStatus());
			user.setCreateUserId(resUserDTO.getCreateUserId());
			user.setUpdateUserId(currentId);
			user.setUpdateTime(new Date());
			user.setRemarks(reqAddUserDTO.getRemarks());		
			userDao.addUser(user);
			
			//删除用户角色关联
			userDao.deleteUserRole(userId);
		
			//添加角色关联
			for (int i = 0; i < reqAddUserDTO.getRoleIds().size(); i++) {
				SysUserRole sysUserRole=new SysUserRole();
				sysUserRole.setSysUserId(user.getSysUserId());
				sysUserRole.setSysRoleId(reqAddUserDTO.getRoleIds().get(i));
				userDao.addUserRole(sysUserRole);
			}
			
		}
	}
	
	/**
	 * @Description: 删除用户信息
	 * @param userId 用户id       
	 * @date 2016年12月1日 下午2:33:16
	 * @author SUNZHICHENG 
	 * @since V2.6.2
	 */
	@LogRecord(moduleName="用户管理",option="删除")
	@Override
	@Transactional(readOnly=false)
	public boolean deleteUser(Integer userId) {
		return userDao.deleteUser(userId);
	}
	
	/**
	 * @Description: 修改用户是否可用的状态
	 * @param userId  用户id      
	 * @date 2016年12月1日 下午2:30:19
	 * @author SUNZHICHENG 
	 * @since V2.6.2
	 */
	@LogRecord(moduleName="用户管理",option="启用/禁用")
	@Override
	@Transactional(readOnly=false)
	public boolean ModifyUserState(Integer userId,Integer state) {		
		return  userDao.ModifyUserState(userId, state);
	}
	
	/**
	 * @Description:修改密码 
	 * @date 2016年12月14日 下午4:47:09
	 * @author SUNZHICHENG 
	 * @since V2.6.2
	 */
	@LogRecord(moduleName="用户管理",option="修改密码")
	@Override
	@Transactional(readOnly=false)
	public void updatePassWord(Integer userId, String newPwd) {
			
		//获取当前登录用户信息
		ShiroUser shiroUser = ShiroKit.getUser();
		Integer currentId=shiroUser.getId();
		
		//获取要修改的用户
		SysUser sysUser = userDao.getSysUserById(userId);
		sysUser.setPassword(newPwd);
		sysUser.setUpdateTime(new Date());
		sysUser.setUpdateUserId(currentId);
		userDao.addUser(sysUser);
		
	}

	
}
